#include "Cliente.h"
#include "../common/Conversor.h"
#include <vector>
#include "../modelo/Objetos/Dinamicos/Huevo.h"
#include <iostream>
#include "MenuEsperando.h"

Cliente::Cliente(Canvas* canvas,const char *host,int puerto)
{
	this->socket = new Socket(host, puerto);
	this->canvas = canvas;
}

std::vector<short> Cliente::getPartidas(){
	this->socket->enviar(Conversor::serializar('G'));
	std::string rcv = this->socket->recibir();

	return Conversor::deSerializar(rcv);
}

void Cliente::crearPartida(short codNivel, short cantidadDeJugadores) {
	this->socket->enviar(Conversor::serializar('C', codNivel, cantidadDeJugadores));
	//std::string rcv = conexion->recibir();
	MenuEsperando m(this->socket);
	m.correr();	
	if (m.rcv.c_str()[0] == 'I') {
		partidaLocal = new PartidaLocal(canvas,false);
		inboxCliente = new InboxCliente(this, this->socket);
		inboxCliente->Start();
		partidaLocal->iniciar();
		this->socket->enviar(Conversor::serializar('I'));
	}
}

void Cliente::unirseAPartida(short iDPartida) {
	this->socket->enviar(Conversor::serializar('U',iDPartida));
	//std::string rcv = conexion->recibir();
	MenuEsperando m(this->socket);
	m.correr();
	if (m.rcv.c_str()[0] == 'I') {
		partidaLocal = new PartidaLocal(canvas,false);
		inboxCliente = new InboxCliente(this, this->socket);
		inboxCliente->Start();
		partidaLocal->iniciar();
		this->socket->enviar(Conversor::serializar('I'));
	}
}

void Cliente::cargarObjeto(Objeto *obj) {
	partidaLocal->getJuego()->cargarObjeto(obj);
}

void Cliente::matarObjeto(short id) {
	partidaLocal->getJuego()->matarObjeto(id);
}

void Cliente::notificarPartidaGanada() {
	partidaLocal->getJuego()->detenerJuego(true);
	inboxCliente->Stop();	
}
void Cliente::notificarPartidaPerdida() {
	partidaLocal->getJuego()->detenerJuego(false);
	inboxCliente->Stop();
}

void Cliente::lanzarHuevo(short velX, short velY) {
	this->socket->enviar(Conversor::serializar('L', velX, velY));
}

Cliente::~Cliente(void)
{
}
PartidaLocal* Cliente::getPartida(){
	return partidaLocal;
}
